"""
评价展示卡片组件
用于显示单个评价的详细信息
"""

import tkinter as tk
from tkinter import ttk
from core.models.review import Review
from core.utils.logger import debug


class ReviewCard(ttk.Frame):
    """评价卡片组件"""
    
    def __init__(self, parent, review: Review, show_helpful=True):
        """
        初始化评价卡片
        
        Args:
            parent: 父组件
            review: 评价对象
            show_helpful: 是否显示"有用"按钮
        """
        super().__init__(parent, style='Card.TFrame', padding=10)
        
        self.review = review
        self.show_helpful = show_helpful
        
        self._create_card()
    
    def _create_card(self):
        """创建评价卡片"""
        # 头部信息（用户名、评分、时间）
        header_frame = ttk.Frame(self)
        header_frame.pack(fill='x', pady=(0, 8))
        
        # 用户名
        user_label = ttk.Label(header_frame, text=f'👤 {self.review.user_name}', 
                              font=('Arial', 11, 'bold'))
        user_label.pack(side='left')
        
        # 评分
        from ui.components.star_rating import StarRatingDisplay
        rating_display = StarRatingDisplay(header_frame, self.review.rating, size=12, show_text=False)
        rating_display.pack(side='left', padx=(10, 0))
        
        # 获取主题颜色
        from ui.styles.theme import Theme
        fg_secondary = Theme.get_color('fg_secondary')
        fg_tertiary = Theme.get_color('fg_tertiary')
        
        # 评分文字
        rating_text = ttk.Label(header_frame, text=f'{self.review.rating}星 - {self.review.get_rating_text()}', 
                               font=('Arial', 9), foreground=fg_secondary)
        rating_text.pack(side='left', padx=(5, 0))
        
        # 时间
        time_label = ttk.Label(header_frame, text=self.review.get_created_time_display(), 
                              font=('Arial', 9), foreground=fg_tertiary)
        time_label.pack(side='right')
        
        # 评论内容 - 调试：打印评论内容
        if hasattr(self.review, 'comment'):
            debug(f"Review comment: '{self.review.comment}'")
        
        if self.review.comment and self.review.comment.strip():
            comment_frame = ttk.Frame(self)
            comment_frame.pack(fill='x', pady=(0, 8))
            
            comment_label = ttk.Label(comment_frame, text='💬 评论：', font=('Arial', 10, 'bold'))
            comment_label.pack(anchor='w', pady=(0, 5))
            
            comment_text = tk.Text(comment_frame, height=3, wrap='word', font=('Arial', 10),
                                 state='disabled', bg=self.cget('background'))
            comment_text.pack(fill='x')
            comment_text.config(state='normal')
            comment_text.insert('1.0', self.review.comment)
            comment_text.config(state='disabled')
        
        # 图片展示 - 调试：打印图片信息
        if hasattr(self.review, 'images'):
            debug(f"Review images: {self.review.images}")
        
        if self.review.images and len(self.review.images) > 0:
            self._create_image_display()
        
        # 底部操作区域
        if self.show_helpful:
            self._create_footer()
    
    def _create_image_display(self):
        """创建图片展示区域"""
        image_frame = ttk.Frame(self)
        image_frame.pack(fill='x', pady=(0, 8))
        
        ttk.Label(image_frame, text='📷 图片：', font=('Arial', 9), foreground='#666').pack(anchor='w')
        
        # 图片网格
        images_frame = ttk.Frame(image_frame)
        images_frame.pack(fill='x', pady=(5, 0))
        
        from core.utils.image_utils import load_thumbnail
        from core.utils.logger import debug, error
        
        for i, image_path in enumerate(self.review.images[:6]):  # 最多显示6张
            debug(f"Loading image {i+1}: {image_path}")
            img_frame = ttk.Frame(images_frame, style='Card.TFrame')
            img_frame.grid(row=i//3, column=i%3, padx=5, pady=2, sticky='w')
            
            # 尝试加载真实图片
            try:
                thumbnail = load_thumbnail(image_path, size=(100, 100))
                
                if thumbnail:
                    # 成功加载图片，显示真实图片
                    img_label = ttk.Label(img_frame, image=thumbnail)
                    img_label.image = thumbnail  # 保持引用避免被垃圾回收
                    img_label.pack(padx=5, pady=5)
                    debug(f"✓ Image {i+1} loaded successfully: {image_path}")
                    
                    # 可选：显示文件名（小字）
                    filename = image_path.split('/')[-1] if '/' in image_path else image_path.split('\\')[-1]
                    if len(filename) > 15:
                        filename = filename[:12] + '...'
                    ttk.Label(img_frame, text=filename, font=('Arial', 7), 
                            foreground='#999', anchor='center').pack()
                else:
                    # 加载失败，显示占位符和文件名
                    error(f"✗ Failed to load image: {image_path}")
                    filename = image_path.split('/')[-1] if '/' in image_path else image_path.split('\\')[-1]
                    if len(filename) > 15:
                        filename = filename[:12] + '...'
                    
                    # 图片占位符
                    img_placeholder = ttk.Label(img_frame, text='🖼️', font=('Arial', 20), 
                                              foreground='#CCCCCC', width=8, anchor='center')
                    img_placeholder.pack(padx=5, pady=5)
                    
                    # 文件名
                    ttk.Label(img_frame, text=filename, font=('Arial', 8), 
                            foreground='#666', anchor='center').pack()
            except Exception as e:
                error(f"Exception while loading image {image_path}: {e}")
                # 显示错误占位符
                error_label = ttk.Label(img_frame, text='❌', font=('Arial', 20), 
                                      foreground='#FF0000', width=8, anchor='center')
                error_label.pack(padx=5, pady=5)
    
    def _create_footer(self):
        """创建底部操作区域"""
        footer_frame = ttk.Frame(self)
        footer_frame.pack(fill='x')
        
        # 有用按钮
        helpful_btn = ttk.Button(footer_frame, text=f'👍 有用 ({self.review.helpful_count})', 
                               command=self._mark_helpful, width=12)
        helpful_btn.pack(side='left')
        
        # 分隔线
        ttk.Separator(footer_frame, orient='vertical').pack(side='left', fill='y', padx=10)
        
        # 评价ID（调试用）
        if debug:
            ttk.Label(footer_frame, text=f'ID: {self.review.review_id[:8]}...', 
                     font=('Arial', 8), foreground='#CCC').pack(side='right')
    
    def _mark_helpful(self):
        """标记为有用"""
        # 这里应该调用 ReviewService 的 mark_helpful 方法
        # 为了简化，这里只是更新显示
        self.review.add_helpful()
        
        # 更新按钮文本
        for widget in self.winfo_children():
            if isinstance(widget, ttk.Frame):
                for child in widget.winfo_children():
                    if isinstance(child, ttk.Button) and '有用' in child.cget('text'):
                        child.config(text=f'👍 有用 ({self.review.helpful_count})')
                        break


class ReviewList(ttk.Frame):
    """评价列表组件"""
    
    def __init__(self, parent, reviews, show_helpful=True):
        """
        初始化评价列表
        
        Args:
            parent: 父组件
            reviews: 评价列表
            show_helpful: 是否显示"有用"按钮
        """
        super().__init__(parent)
        
        self.reviews = reviews
        self.show_helpful = show_helpful
        
        self._create_list()
    
    def _create_list(self):
        """创建评价列表"""
        if not self.reviews:
            # 无评价时的提示
            no_reviews_label = ttk.Label(self, text='暂无评价', 
                                       font=('Arial', 12), foreground='#999')
            no_reviews_label.pack(pady=20)
            return
        
        # 创建滚动框架
        from ui.components.scrollable_frame import ScrollableFrame
        scrollable_frame = ScrollableFrame(self)
        scrollable_frame.pack(fill='both', expand=True)
        
        # 添加评价卡片
        for i, review in enumerate(self.reviews):
            card = ReviewCard(scrollable_frame.scrollable_frame, review, self.show_helpful)
            card.pack(fill='x', pady=(0 if i == 0 else 10, 0))
    
    def update_reviews(self, reviews):
        """更新评价列表"""
        self.reviews = reviews
        # 清除现有组件
        for widget in self.winfo_children():
            widget.destroy()
        # 重新创建
        self._create_list()
